#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
ANSI工具模块
提供ANSI转义序列解析和处理功能
"""

import re
from typing import List, Tuple

# ANSI转义序列正则表达式
ANSI_ESCAPE_PATTERN = re.compile(r'\x1b\[([0-9;]*)([a-zA-Z])')


def parse_ansi_text(text: str) -> List[Tuple[str, str]]:
    """
    解析包含ANSI颜色代码的文本
    
    Args:
        text (str): 包含ANSI代码的文本
        
    Returns:
        list: 格式化文本列表，每个元素为(样式, 文本)的元组
    """
    # 如果没有ANSI代码，直接返回
    if '\x1b[' not in text:
        return [('', text)]
    
    result = []
    last_end = 0
    
    # 查找所有ANSI转义序列
    for match in ANSI_ESCAPE_PATTERN.finditer(text):
        # 添加转义序列前的文本
        if match.start() > last_end:
            result.append(('', text[last_end:match.start()]))
        
        # 处理ANSI转义序列（这里简化处理，实际可以更复杂）
        codes, command = match.groups()
        style = ansi_to_style(codes, command)
        
        last_end = match.end()
    
    # 添加剩余文本
    if last_end < len(text):
        result.append(('', text[last_end:]))
    
    return result


def ansi_to_style(codes: str, command: str) -> str:
    """
    将ANSI代码转换为样式
    
    Args:
        codes (str): ANSI代码参数
        command (str): ANSI命令字符
        
    Returns:
        str: 对应的样式字符串
    """
    # 简化处理，实际ANSI支持更复杂的颜色和样式
    if command == 'm':  # SGR (Select Graphic Rendition)
        if codes == '0' or codes == '':
            return ''  # 重置
        elif codes == '30':
            return 'fg:black'
        elif codes == '31':
            return 'fg:red'
        elif codes == '32':
            return 'fg:green'
        elif codes == '33':
            return 'fg:yellow'
        elif codes == '34':
            return 'fg:blue'
        elif codes == '35':
            return 'fg:magenta'
        elif codes == '36':
            return 'fg:cyan'
        elif codes == '37':
            return 'fg:white'
        # 可以添加更多ANSI代码处理
    
    return ''


def remove_ansi_codes(text: str) -> str:
    """
    移除文本中的ANSI转义序列
    
    Args:
        text (str): 包含ANSI转义序列的文本
        
    Returns:
        str: 移除ANSI转义序列后的纯文本
    """
    # ANSI转义序列的正则表达式模式
    ansi_escape_pattern = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
    return ansi_escape_pattern.sub('', text)

def has_ansi_codes(text: str) -> bool:
    """
    检查文本是否包含ANSI转义序列
    
    Args:
        text (str): 要检查的文本
        
    Returns:
        bool: 如果包含ANSI转义序列返回True，否则返回False
    """
    ansi_escape_pattern = re.compile(r'\x1B(?:[@-Z\\-_]|\[[0-?]*[ -/]*[@-~])')
    return bool(ansi_escape_pattern.search(text))

def _find_ansi_end(text: str, start: int) -> int:
    """
    查找ANSI代码的结束位置
    
    Args:
        text (str): 要搜索的文本
        start (int): ANSI代码的起始位置
        
    Returns:
        int: ANSI代码的结束位置，如果未找到则返回起始位置
    """
    i = start + 2  # 跳过 ESC 和 '['
    while i < len(text):
        # ANSI代码以字母结束（A-Z, a-z, @, ` 等）
        if text[i].isalpha() or text[i] in '@`':
            return i
        i += 1
    return start

def remove_control_chars(text: str) -> str:
    """
    移除文本中的不可打印控制字符，但保留ANSI颜色代码
    
    Args:
        text (str): 要处理的文本
        
    Returns:
        str: 移除不可打印控制字符后的文本
    """
    # 保留ANSI颜色代码，但移除其他可能导致显示问题的控制字符
    cleaned_text = ''
    i = 0
    while i < len(text):
        # 检查是否是ANSI颜色代码
        if text[i] == '\x1b' and i + 1 < len(text) and text[i+1] == '[':
            # 查找ANSI代码的结束位置
            ansi_end = _find_ansi_end(text, i)
            if ansi_end > i:
                # 保留完整的ANSI代码
                cleaned_text += text[i:ansi_end+1]
                i = ansi_end + 1
                continue
        
        # 处理普通字符
        char = text[i]
        if char == '\t':
            # 将制表符替换为4个空格，避免在终端中显示为^I
            cleaned_text += '    '
        # 保留可打印字符、换行符、回车符和中文字符
        elif ord(char) >= 32 or char in '\n\r' or ord(char) > 127:
            cleaned_text += char
        i += 1
    
    # 处理特殊字符显示问题
    cleaned_text = cleaned_text.replace('\r\n', '\n').replace('\r', '\n')
    
    return cleaned_text